package opf5.persistencia.proxies;

import java.util.List;

import opf5.entities.dominio.Calificacion;
import opf5.entities.dominio.Infraccion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.jugadores.JugadorConcreto;
import opf5.persistencia.OPF5DBGateway;
import opf5.utilidades.Fecha;

public class JugadorDBProxy implements Jugador {
	private JugadorConcreto jugadorConcreto;
	boolean calificacionesCargadas = false;
	boolean infraccionesCargadas = false;
	
	public JugadorDBProxy(JugadorConcreto jugador) {
		this.jugadorConcreto = jugador;
	}

	public JugadorDBProxy() {
		this.jugadorConcreto = new JugadorConcreto(null, null, null);
	}
	
	@Override
	public List<Calificacion> getCalificaciones() {
		if (! calificacionesCargadas) {
			List<Calificacion> calificaciones = OPF5DBGateway.getCalificacionesJugador(this);
			this.jugadorConcreto.setCalificaciones(calificaciones);
			this.calificacionesCargadas = true;
		}
		return jugadorConcreto.getCalificaciones();
	}

	@Override
	public String getEmail() {
		return jugadorConcreto.getEmail();
	}

	@Override
	public int getCantidadDeInfracciones() {
		this.getInfracciones();
		return jugadorConcreto.getCantidadDeInfracciones();
	}

	@Override
	public String getNombre() {
		return jugadorConcreto.getNombre();
	}

	@Override
	public Fecha getFechaNac() {
		return jugadorConcreto.getFechaNac();
	}
	
	@Override
	public int getHandicap() {
		return jugadorConcreto.getHandicap();
	}

	@Override
	public List<Infraccion> getInfracciones() {
		if (!infraccionesCargadas) {
			this.jugadorConcreto.setInfracciones(OPF5DBGateway.getInfraccionesJugador(this));
			this.infraccionesCargadas = true;
		}
		
		return jugadorConcreto.getInfracciones();
	}

	@Override
	public boolean fueCalificadoPor(Jugador jugador, Partido partido) {
		this.getCalificaciones();
		return jugadorConcreto.fueCalificadoPor(jugador, partido);
	}

	@Override
	public Calificacion getCalificacion(Jugador jugador, Partido partido) {
		this.getCalificaciones();
		return jugadorConcreto.getCalificacion(jugador, partido);
	}

	@Override
	public void agregarInfraccion(Infraccion infraccion) {
		this.getInfracciones();
		jugadorConcreto.agregarInfraccion(infraccion);
		OPF5DBGateway.agregarInfraccion(this, (InfraccionDBProxy) infraccion);
	}

	@Override
	public void setHandicapJugador(int handicap) {
		this.jugadorConcreto.setHandicapJugador(handicap);
		OPF5DBGateway.guardarJugador(this);
	}

	public void setHandicap(int handicap) {
		this.jugadorConcreto.setHandicapJugador(handicap);
	}
	
	@Override
	public void agregarCalificacion(Calificacion calificacion) {
		jugadorConcreto.agregarCalificacion(calificacion);
		OPF5DBGateway.agregarCalificacion(this, (CalificacionDBProxy) calificacion);
	}
	
	public boolean getEsAdministrador() {
		return this.jugadorConcreto.getEsAdministrador();
	}
	
	public String getFechaNacimiento() {
		return jugadorConcreto.getFechaNac().toString();
	}
	
	public void setNombre(String nombre) {
		this.jugadorConcreto.setNombre(nombre);
	}
	
	public void setEmail(String email) {
		this.jugadorConcreto.setEmail(email);
	}
	
	public void setFechaNacimiento(String fecha) {
		this.jugadorConcreto.setFechaNacimiento(new Fecha(fecha, "yyyy-MM-dd HH:mm"));
	}
	
	public void setEsAdministrador(boolean es) {
		this.jugadorConcreto.setEsAdministrador(es);
	}
	
	@Override
	public boolean equals(Object o) {
		return this.getNombre().equals(((Jugador) o).getNombre());
	}
	
	public JugadorConcreto getJugadorConcreto() {
		return this.jugadorConcreto;
	}
}
